為甚麼需要架構呢? 簡單來說就是將我們放在一個MainActivity中,超級複雜的一推程式碼進行做分類處理,讓之後自己或他人比較輕鬆去閱讀程式碼。
雖然我標題只有MVP架構,但基本上有3種架構種類,但我只會大概提一下其他兩個架構。
後面會做一下MVP架構的範例。
MVC
M=> Model,主要管理資料來源,如:SharedPreferences
V=> UI,就是View,如:Activity、Fragment
C=> Controller,介於View及Model之間的管道
MVP
M=> Model,主要管理資料來源,如:SharedPreferences
V=> UI,就是View,如:Activity、Fragment
P=> Presenter,View及Model之間的管道,負責邏輯處理
MVVM
M=> Model,主要管理資料來源,如:SharedPreferences
V=> UI,就是View,如:Activity、Fragment
(比較困難)
有大致了解後,我們就來上手做,這樣比較清楚,用簡單一點的登入畫面。
我們除了原本的MainActivity外,需要再新增兩個Class和一個Interface。
自己的com.example.(名稱)右鍵>New>點擊Java Class
命名完,且都新增完會長這樣
MainActivity介面
SettingActivity介面
MainActivity
//在MainActivity先拿取登入資料
//在後面加入implements
public class MainActivity extends AppCompatActivity implements MainContract.view{
private EditText accontEditText;
private EditText passwordEditText;
private Button sendoutButton;
private Context context=this;
private MainPresenter mainPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
accontEditText = findViewById(R.id.main_accont_et);
passwordEditText = findViewById(R.id.main_password_et);
sendoutButton = findViewById(R.id.main_sendout_btn);
//New出Presenter,並把自己丟入。
mainPresenter =new MainPresenter(this);
sendoutButton.setOnClickListener(new View.OnClickListener() {
@Override
//當按下送出按鈕,拿取password和account給presente
public void onClick(View view) {
mainPresenter.getLoginData(passwordEditText.getText().toString(),accontEditText.getText().toString());
}
});
}
//當presente判斷帳密輸入錯誤,呼叫此方法。
@Override
public void loginError(){
Toast.makeText(context,"帳密錯誤",Toast.LENGTH_SHORT).show();
}
@Override
public void showUserName(String userName){
Toast.makeText(context,"歡迎登入"+userName,Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this, SettingActivity.class);
//指定名稱字串,可用標籤取得資料
intent.putExtra("NAME",userName);//將bmi放進Intent
startActivity(intent);//將intent 發送到Android,判別後顯示到SA畫面中
}
}
public class SettingActivity extends AppCompatActivity {
private TextView msgTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_setting);
msgTextView = findViewById(R.id.setting_msg_tv);
//呼叫Activity,取得intent
Intent intent = getIntent();
String Name = intent.getStringExtra("NAME");
//get型態Extra 取得資料(資料標籤)
msgTextView.setText("歡迎登入\n"+Name);
}
}
//在Presenter做帳密判斷
public class MainPresenter implements MainContract.presenter{
private MainContract.view callBack;
private String userName;
private MainModle modle;
public MainPresenter(MainContract.view view){
//接收View。
this.callBack =view;
//New出Modle,並把自己丟入。
modle=new MainModle(this);
}
//如果帳密正確,到Modle拿取登入著資料,之後傳回給Presenter,最後再傳回給View顯示
@Override
public void getLoginData(String password, String account) {
//登入正確,
if(password.equals("123456")&&account.equals("neva")) {
//到Modle拿取登入人員資料。
userName = modle.getUserName();
//再傳回view,叫view更新畫面。
callBack.showUserName(userName);
}
//登入錯誤。
else
callBack.loginError();
}
}
public class MainModle implements MainContract.modle{
private MainContract.presenter callBack;
public MainModle(MainContract.presenter presenter) {
//接收presenter
this.callBack =presenter;
}
//回傳登入人員資料
@Override
public String getUserName() {
return "neva";
}
}
//在 interface MainContract 是用來讓Presenter,View,Modle互相溝通
//並在 interface Contract新增三個interface,並新增他們的方法
public interface MainContract {
interface view{
void loginError();
void showUserName(String userName);
}
interface presenter{
void getLoginData(String password, String account);
}
interface modle{
String getUserName();
}
}